#include "feactualdataservice.h"
#include "feactualdataservice_private.h"

FeActualDataServiceImpl::FeActualDataServiceImpl(QObject *parent)
: QObject(parent)
{
}

FeActualDataServiceImpl::~FeActualDataServiceImpl()
{
}

void FeActualDataServiceImpl::start()
{
	FeActualDataProvider *provider;
	foreach(provider, providers)
	{
		QList<FeActualDataId> data_list = provider->dataList();
		FeActualDataId id;
		foreach(id, data_list)
		{
			if(!data_tab.contains(id))
			{
				FeActualDataItem &item = 
					data_tab.insert(id, FeActualDataItem(provider)).value();
			}
		}
		provider->start();
	}
}

void FeActualDataServiceImpl::stop()
{
	FeActualDataProvider *provider;
	foreach(provider, providers)
	{
		provider->stop();
	}
	data_tab.clear();
}

void FeActualDataServiceImpl::registerDataProvider(FeActualDataProvider *provider)
{
	Q_ASSERT(provider);
	if(!providers.contains(provider))
	{
		providers.append(provider);
	}
}

bool FeActualDataServiceImpl::sendDataChanged(FeActualDataId id, const QVariant &value)
{
	QMap<FeActualDataId, FeActualDataItem>::iterator i =
		data_tab.find(id);
	if(i == data_tab.end())
	{
		return false;
	}

	FeActualDataItem &item = i.value();
	{
		FeActualDataConsumer *consumer;
		foreach(consumer, item.consumers)
		{
			consumer->dataChanged(id, value);
		}
	}
	return true;
}

bool FeActualDataServiceImpl::addDataConsumer(FeActualDataId id, FeActualDataConsumer *consumer)
{
	Q_ASSERT(consumer);
	QMap<FeActualDataId, FeActualDataItem>::iterator i =
		data_tab.find(id);
	if(i == data_tab.end())
	{
		return false;
	}

	FeActualDataItem &item = i.value();

	bool activate = item.consumers.isEmpty();
	if(!item.consumers.contains(consumer))
	{
		item.consumers.append(consumer);
	}

	if(activate)
	{
		item.provider->activateDataPoll(id);
	}

	return true;
}

bool FeActualDataServiceImpl::removeDataConsumer(FeActualDataId id, FeActualDataConsumer *consumer)
{
	Q_ASSERT(consumer);
	QMap<FeActualDataId, FeActualDataItem>::iterator i =
		data_tab.find(id);
	if(i == data_tab.end())
	{
		return false;
	}
	
	
	FeActualDataItem &item = i.value();
	bool removed = (item.consumers.removeAll(consumer) != 0);

	if(removed && item.consumers.isEmpty())
	{
		item.provider->deactivateDataPoll(id);
	}
	return removed;
}

bool FeActualDataServiceImpl::queryDataUpdate(FeActualDataId id)
{
	QMap<FeActualDataId, FeActualDataItem>::iterator i =
		data_tab.find(id);
	if(i == data_tab.end())
	{
		return false;
	}	
	
	FeActualDataItem &item = i.value();
	item.provider->queryDataUpdate(id);

	return true;
}